package com.acmen.easyapi.parse;

import com.acmen.easyapi.model.ReqParamNode;
import com.acmen.easyapi.util.AnnotationUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestPart;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.List;


/**
 * 接口详细说明表格工具
 *
 * @author acmen
 */
@Component
public class RequestPartParser extends BaseRequestParser {

    public ReqParamNode createParamNode(Method method) {
        // 获取方法的参数注解
        List<List<Annotation>> parameterAnnotations = AnnotationUtil.getParameterAnnotations(method);
        // 获取方法的参数类型
        Class[] parameterTypes = method.getParameterTypes();
        // 获取方法的参数的通配符类型
        Type[] genericParameterTypes = method.getGenericParameterTypes();

        // 如果方法没有参数，则返回null
        if (genericParameterTypes.length == 0) {
            return null;
        }

        // 遍历参数的通配符类型
        for (int i=0;i<genericParameterTypes.length;i++) {
            // 获取参数的RequestPart注解
            RequestPart requestPart = AnnotationUtil.getAnnotation(parameterAnnotations.get(i), RequestPart.class);
            // 如果参数有RequestPart注解
            if(requestPart!=null){
                Type genericType = genericParameterTypes[i];
                Class pType = parameterTypes[i];
                // 创建请求参数的根节点
                ReqParamNode root = new ReqParamNode();
                root.setName(ReqParamNode.NODE_BODY);
                root.setLabel("请求体");
                root.setArray(false);
                root.setType(pType.getName());
                root.setTypeAlias(getDataTypeAlias(genericType,new HashMap<>()));
                // 创建参数的子节点
                root.setSubNodes((List)createParamNodes(genericType, new HashMap<>()));
                // 返回请求参数的根节点
                return root;
            }
        }
        // 如果没有匹配的参数注解，则返回null
        return null;

    }
}
